home *** CD-ROM | disk | FTP | other *** search
- ''
- '' $Id: Audio.bas,v 1.5 1994/03/16 10:54:43 alex Rel $
- ''
- '' Simple audio.device example
- ''
- '' Derived from RKM example (c) Copyright 1992 Commodore-Amiga, Inc.
- ''
-
- DEFINT A-Z
-
- 'REM $INCLUDE Exec.bh
- 'REM $INCLUDE Graphics.bh
- 'REM $INCLUDE Audio.bc
-
- REM $INCLUDE BLib/ExecSupport.bas
-
- LIBRARY OPEN "exec.library", LIBRARY_MINIMUM&
- LIBRARY OPEN "graphics.library", LIBRARY_MINIMUM&
-
- '
- 'Ask the system if we are PAL or NTSC and set clock constant accordingly
- '
- FUNCTION getAudioClock&
- STATIC GfxBase&, palflag
-
- getAudioClock& = -1&
- palflag = PAL&
- IF PEEKW(LIBRARY("graphics.library") + lib_Version) >= 39 THEN
- 'V39 and above have an early-start independent PAL detection method
-
- palflag = REALLY_PAL&
- END IF
- IF PEEKW(LIBRARY("graphics.library") + DisplayFlags) AND palflag THEN
- getAudioClock& = 3546895& 'PAL clock
- ELSE
- getAudioClock& = 3579545& 'NTSC clock
- END IF
- END FUNCTION
-
- '
- 'Set up the audio I/O block for channel allocation
- '
- SUB allocateAudioChannels(BYVAL audioIO&, BYVAL audioMP&)
- STATIC ioreq&, whichannel&
-
- ioreq& = audioIO& + ioa_Request
-
- POKEL ioreq& + IORequestio_Message + mn_ReplyPort, audioMP& ' the address of a reply port
- POKEB ioreq& + IORequestio_Message + mn_Node + ln_Pri, 0 ' neutral priority
- POKEW ioreq& + IORequestio_Command, ADCMD_ALLOCATE& ' allocate the channels
- POKEB ioreq& + IORequestio_Flags, ADIOF_NOWAIT&
-
- POKEW audioIO& + ioa_AllocKey, 0
-
- whichannel& = &h01020408 ' channel allocation
- POKEL audioIO& + ioa_Data, VARPTR(whichannel&)
- POKEL audioIO& + ioa_Length, 4
- END SUB
-
-
- '
- 'Set up audio I/O block to play a sample using CMD_WRITE
- '
- SUB setupAudioPlay(BYVAL audioIO&, BYVAL audioMP&, _
- BYVAL waveptr&, BYVAL samples&, BYVAL frequency&, BYVAL samcyc&, _
- BYVAL duration&, BYVAL clock&)
- STATIC ioreq&, whichannel&
-
- 'The io_Flags are set to ADIOF_PERVOL so we can set the
- 'period (speed) and volume with the our sample;
- 'ioa_Data points to the sample; ioa_Length gives the length
- 'ioa_Cycles tells how many times to repeat the sample
- 'If you want to play the sample at a given sampling rate,
- 'set ioa_Period = clock/(given sampling rate)
-
- ioreq& = audioIO& + ioa_Request
-
- POKEL ioreq& + IORequestio_Message + mn_ReplyPort, audioMP& ' the address of a reply port
- POKEW ioreq& + IORequestio_Command, CMD_WRITE&
- POKEB ioreq& + IORequestio_Flags, ADIOF_PERVOL&
-
- POKEL audioIO& + ioa_Data, waveptr&
- POKEL audioIO& + ioa_Length, samples&
-
- POKEW audioIO& + ioa_Period, (clock& * samcyc&) \ (samples& * frequency&)
- POKEW audioIO& + ioa_Volume, 64
- POKEW audioIO& + ioa_Cycles, (frequency& * duration&) \ samcyc&
- END SUB
-
- SUB main
- STATIC clock&, waveptr&, audioIO&, audioMP&, device&, junk&
-
- clock& = getAudioClock&
- IF clock& <> -1 THEN
- '
- 'Create an audio I/O block so we can send commands to the audio device
- '
- audioIO& = AllocMem(IOAudio_sizeof, MEMF_PUBLIC& OR MEMF_CLEAR&)
- IF audioIO& <> 0 THEN
- '
- 'Create a reply port so the audio device can reply to our commands
- '
- audioMP& = CreatePort&(NULL&, 0)
- IF audioMP& <> 0 THEN
- allocateAudioChannels audioIO&,audioMP&
- device& = OpenDevice&(SADD("audio.device" + CHR$(0)), 0, audioIO&, 0)
- IF device& = 0 THEN
- '
- 'Create a very simple audio sample in memory
- '
- waveptr& = AllocMem&(2, MEMF_CHIP& OR MEMF_PUBLIC&)
- IF waveptr& <> 0 THEN
- POKEB waveptr& + 0, 127
- POKEB waveptr& + 1, -127
- setupAudioPlay audioIO&, audioMP&, waveptr&, 2, 440, 1, 3, clock&
- BeginIO audioIO&
- junk& = WaitPort(audioMP&)
- junk& = GetMsg(audioMP&)
- FreeMem waveptr&, 2
- END IF
- CloseDevice audioIO&
- END IF
- DeletePort AudioMP&
- END IF
- FreeMem AudioIO&, IOAudio_sizeof
- END IF
- END IF
- END SUB
-
- main ' start the main program
- END
-